/**
  ******************************************************************************
  * @file    adc.h
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-27
  * @brief   adc驱动,适用于PIC16(L)F1788_9
  *
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

#ifndef __ADC_H
#define __ADC_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common.h"

/* 宏定义---------------------------------------------------------------------*/
#define ADC_CMD(x)                          (ADON = (x))
    
/* adc_clk_source */
#define ADC_CLK_FOSC_2                      (0u) /* Fosc/2 */
#define ADC_CLK_FOSC_4                      (4u) /* Fosc/4 */
#define ADC_CLK_FOSC_8                      (1u)
#define ADC_CLK_FOSC_16                     (5u)
#define ADC_CLK_FOSC_32                     (2u)
#define ADC_CLK_FOSC_64                     (6u)
#define ADC_CLK_FRC                         (7u) /* adc专用Frc振荡器 */
/* adc_chs adc_chsn  */
#define ADC_CH_AN0                          (0u) /* AN0模拟输入引脚 */
#define ADC_CH_AN1                          (1u)
#define ADC_CH_AN2                          (2u)
#define ADC_CH_AN3                          (3u)
#define ADC_CH_AN4                          (4u)
#define ADC_CH_AN5                          (5u)
#define ADC_CH_AN6                          (6u)
#define ADC_CH_AN7                          (7u)
#define ADC_CH_AN8                          (8u)
#define ADC_CH_AN9                          (9u)
#define ADC_CH_AN10                         (10u)
#define ADC_CH_AN11                         (11u)
#define ADC_CH_AN12                         (12u)
#define ADC_CH_AN13                         (13u)
#define ADC_N_CH_NV                         (15u) /* 负差分输入由负参考电压提供 */
/* adc_result_mode */
#define ADC_RESULT_12b                      (0u) /* 12位结果 */
#define ADC_RESULT_10b                      (1u) /* 10位结果 */
/* adc_result_format */
#define ADC_FORMAT_SYMBOL                   (0u) /* 符号数值 */
#define ADC_FORMAT_BIN                      (1u) /* 二进制补码 */
/* adc_positive_voltage */
#define ADC_PV_VDD                          (0u) /* 正参考电压选择Vdd */
#define ADC_PV_VREF                         (1u) /* 正参考电压选择Vref+ */
#define ADC_PV_FVR                          (3u) /* 正参考电压选择FVR缓冲器1 */
/* adc_negative_voltage */
#define ADC_NV_VSS                          (0u) /* 负参考电压选择Vss */
#define ADC_NV_VREF                         (1u) /* 负参考电压选择Vref- */
/* adc_auto_convert */
#define ADC_AUTO_CLOSE                      (0u)
#define ADC_AUTO_CCP1                       (1u)
/* adc_chsn */
    
/* 类型定义-------------------------------------------------------------------*/
typedef struct adc_config {
    uint8_t clkSource : 3; /* adc时钟源选择位 @ref adc_clk_source */
    uint8_t positiveCh : 5; /* adc正差分输入通道选择位 @ref adc_chs */
    uint8_t resultFormat : 1; /* adc结果格式选择位 @ref adc_result_format */
    uint8_t resultMode : 1; /* adc结果模式位 @ref adc_result_mode */
    uint8_t positiveVoltage : 2; /* adc正参考电压配置位 @ref adc_positive_voltage */
    uint8_t negativeVoltage : 1; /* adc负参考电压配置位 @ref adc_negative_voltage */
    uint8_t autoConvert : 4; /* adc自动转换触发源选择位 @ref adc_auto_convert */
    uint8_t negativeCh : 4; /* adc负差分输入通道选择位 @ref adc_chsn */
} adc_config_t;
    
/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
void adc_init(adc_config_t config);
uint16_t adc_convert(uint8_t positiveCh);

#ifdef __cplusplus
}
#endif

#endif /* adc.h */